跳到主要内容

Linux 文件权限

Linux 常用的权限组合 ⭐

常用的 Linux 文件权限:

444 r--r--r--
600 rw-------
644 rw-r--r--
666 rw-rw-rw-
700 rwx------
744 rwxr--r--
755 rwxr-xr-x
777 rwxrwxrwx

文件权限与归属

文件默认权限

创建一个新的文件或目录时,他的默认权限会是什么呢?

$ umask
022

umask 就是指定 “目前使用者在创建文件或目录时候的权限默认值”

查阅的方式有两种,一种可以直接输入 umask ,就可以看到数字体态的权限设置分数, 一种则是加入 -S (Symbolic) 这个选项,就会以符号类型的方式来显示出权限

$ umask -S
u=rwx,g=rx,o=rx

可以通过 umask 修改默认的文件权限

$ umask 002

检查命令的权限

# 检查命令的位置
which rm
# /bin/rm
# 检查用户组
ls -lh /bin/rm
# -rwxr-xr-x 1 root root 63K 1月 18 2018 /bin/rm

常见的权限字符

-   普通文件
d 目录文件
l 链接文件
b 块设备文件
c 字符设备文件
p 管道设备文件

使用 ll 可以看到文件权限

drwxr-xr-x  3 alsritter alsritter  4096 411 08:55 ./
drwxr-xr-x 21 alsritter alsritter 4096 411 07:02 ../
drwxrwxrwx 2 alsritter alsritter 4096 410 10:48 java_temp/
-rw-rw-r-- 1 alsritter alsritter 2462 411 08:24 temp2.txt
-rw-rw-r-- 1 alsritter alsritter 970 411 08:55 temp3.txt
-rw-r--r-- 1 alsritter alsritter 17242 411 04:37 temp.txt

第一个字符是用来标识是文件夹还是文件

d:表示这个是目录 -:表示这个是文件

后面的每三个为一组: 例如 -rw-rw-r-- 分成 rw- rw- r--

第一组是:owner 权限(所有者的权限) 第二组是:group 权限(当前所有组的权限) 第三组是:others 权限(其他人的权限)

各种权限的组成

三种身份各有自己的 read/write/execute 权限

权限二进制八进制描述
---0000无权限
--x0011只有执行权限
-w-0102只有写入权限
-wx0113写和执行权限
r--1004读权限
r-x1015读取和执行的权限
rw-1106读取的写入的权限
rwx1117所有权限

所以:660 等价于

-rw-rw----

注意:有时候在某些需要加权限的语言中(如 Golang) 0660 也表示 660 因为前面加 0 表示的就是 8 进制

chown 设置文件拥有者

修改组群的命令使 chgrp,即 change group,那么修改文件拥有者的命令自然就是 chown,即 change owner。chown 功能很多,不仅仅能更改文件拥有者,还可以修改文件所属组群。如果需要将某一目录下的所有文件都改变其拥有者,可以使用 -R 参数。

利用 chown 将指定文件的拥有者改为指定的用户或组

  • 用户可以是 “用户名” 或者 “用户 ID”
  • 组可以是 组名 或者 组 ID

使用权限: root

语法

chown [-cfhvR] [--help] [--version] user[:group] file...


# 语法如下:
chown [-R] 账号名称      文件/目录
chown [-R] 账号名称:组群  文件/目录

参数说明:

  • user : 新的文件拥有者的使用者 ID
  • group : 新的文件拥有者的使用者组(group)
  • -c : 显示更改的部分的信息
  • -f : 忽略错误信息
  • -h :修复符号链接
  • -v : 显示详细的处理信息
  • -R : 处理指定目录以及其子目录下的所有文件
  • --help : 显示辅助说明
  • --version : 显示版本

chmod 给文件添加权限 ⭐

注意:只有超管和文件所有者可以修改文件权限

Linux下权限的属组有 拥有者 、群组 、其它组 三种。每个文件都可以针对这三个属组(粒度),设置不同的 r/w/x 权限。

  • u 表示该文件的拥有者
  • g 表示与该文件的拥有者属于同一个群体(group)者
  • o 表示其他以外的人,a 表示这三者皆是。

通常情况下,一个文件只能归属于一个用户和组, 如果其它的用户想有这个文件的权限,则可以将该用户加入具备权限的群组,一个用户可以同时归属于多个组。

语法

chown [-cfhvR] [--help] [--version] user[:group] file...

常用操作

# 使用例
sudo chmod -R 777 /var/log/redis/

# 给文件加执行权限(一般使用这种)⭐
sudo chmod u+x filename

第二行命令的 opt 则是代表操作,可以为:

  • +:添加某个权限
  • -:取消某个权限
  • =:赋予给定的权限,并取消原有的权限

常用的 Linux 文件权限:

444 r--r--r--
600 rw-------
644 rw-r--r--
666 rw-rw-rw-
700 rwx------
744 rwxr--r--
755 rwxr-xr-x
777 rwxrwxrwx

参数说明:

  • user : 新的文件拥有者的使用者 ID
  • group : 新的文件拥有者的使用者组(group)
  • -c : 显示更改的部分的信息
  • -f : 忽略错误信息
  • -h :修复符号链接
  • -v : 显示详细的处理信息
  • -R : 处理指定目录以及其子目录下的所有文件
  • --help : 显示辅助说明
  • --version : 显示版本

例如:

#===============更改文件权限========================================================== 
# 将文件 file1.txt 的拥有者设为 git,群体的使用者 gitgroup :
chown git:gitgroup file1.txt

# 将目前目录下的所有文件与子目录的拥有者皆设为 git,群体的使用者 gitgroup:
chown -R git:gitgroup *

# 设置所有人可以读写及执行
chmod 777 file # (等价于 chmod u=rwx,g=rwx,o=rwx file 或 chmod a=rwx file)

# 设置拥有者可读写,其他人不可读写执行
chmod 600 file # (等价于 chmod u=rw,g=---,o=--- file 或 chmod u=rw,go-rwx file )

#===============更改文件拥有者==========================================================
# 设置文件 d.key、e.txt的拥有者设为 users 群体的 tom
chown tom:users file d.key e.txt

# 设置当前目录下与子目录下的所有文件的拥有者为 users 群体的 James
chown -R James:users *

文件夹、文件权限区别

文件权限

r 读权限read 4 w 写权限write 2 x 可执行(,标识这个文件为可执行文件例如Windows的exe) 1

文件夹权限

r 列出文件列表(仅限于名字) w 可以在目录删除和创建文件(包括修改名字) x 可以进入目录(不能查看目录内容)

文件的所属人没有权限,但是所属组有权限,表示他还是有权限(权限可以 叠加

文件的特殊权限

使用 ls -l 查看 passwd 文件和 temp 文件夹的权限会发现有 s 和 t 权限

$ ll /usr/bin/passwd
-rwsr-xr-x 1 root root 67K Jul 15 2021 /usr/bin/passwd

注:ls -ld 是查看文件夹权限

那这个 s 和 t 是什么权限呢?他们是一组特殊的权限 SUID、SGID、SBIT

SUID、SGID、SBIT 权限都是为了实现特殊功能而设计的,其目的是弥补 ugo 权限无法实现的一些使用场景。

SUID

当 s 出现在文件拥有者的 x 权限上时,就被称为 SETUID BITS 或 SETUID ,其特点如下:

  • SUID 权限仅对二进制可执行文件有效(对脚本无效)
  • 如果执行者对于该二进制可执行文件具有 x 的权限,执行者将具有该文件的所有者的权限
  • 本权限仅在执行该二进制可执行文件的过程中有效

举个例子:

我们的 Linux 系统中,所有帐号的密码都记录在 /etc/shadow 这个文件里面,这个文件的权限为:

$ ls -ld /etc/shadow
-rw-r----- 1 root shadow 1083 Jan 8 18:42 /etc/shadow

意思是这个文件仅有 root 可读且仅有 root 可以强制写入而已。 既然这个文件仅有 root 可以修改,那使用其他用户时是如何修改密码的呢?

再来看下这个 passwd 命令

$ ll /usr/bin/passwd
-rwsr-xr-x 1 root root 67K Jul 15 2021 /usr/bin/passwd

可以发现 passwd 有个 s,其实这就是 SUID 的功能啦!借由上述的功能说明,我们可以知道

  • passwd 的拥有者是 root 这个帐号;
  • 一般用户执行 passwd 的过程中,会 “暂时” 获得 root 的权限;
  • /etc/shadow 就可以被一般用户所执行的 passwd 所修改。

但是如果由一般用户执行 cat 命令去读取 /etc/shadow 文件确是不行的:

$ ls -ld /etc/shadow
-rw-r----- 1 root shadow 1083 Jan 8 18:42 /etc/shadow

原因很清楚,一般用户没有读 /etc/shadow 文件的权限,同时 cat 程序也没有被设置 SUID。

所以整个流程是这样的(tester 是一般用户):

如果想让任意用户通过 cat 命令读取 /etc/shadow 文件的内容也是非常容易的,给它设置 SUID 权限就可以了:

$ sudo chmod 4755 /bin/cat

现在 cat 已经具有了 SUID 权限,试试看,是不是已经可以 cat 到 /etc/shadow 的内容了。因为这样做非常不安全,所以赶快通过下面的命令把 cat 的 SUID 权限移除掉:

$ sudo chmod 755 /bin/cat

SGID

当 s 标志出现在用户组的 x 权限时称为 SGID。SGID 的特点与 SUID 相同

以 mlocale 为例,程序的执行过程如下图所示:

SBIT

当出现 t 时表示它是 SBIT

其实 SBIT 与 SUID 和 SGID 的关系并不大。 SBIT 是 the restricted deletion flag or sticky bit 的简称。 SBIT 目前只对目录有效,用来阻止非文件的所有者删除文件。比较常见的例子就是 /tmp 目录:

$ ll -d /tmp
drwxrwxrwt 2 root root 4.0K Jan 15 15:06 /tmp

权限信息中最后一位 t 表明该目录被设置了 SBIT 权限。SBIT 对目录的作用是:当用户在该目录下创建新文件或目录时,仅有自己和 root 才有权力删除。

设置 SUID、SGID、SBIT 权限

以数字的方式设置权限 SUID、SGID、SBIT 权限对应的数字如下:

SUID->4
SGID->2
SBIT->1

所以如果要为一个文件权限为 "-rwxr-xr-x" 的文件设置 SUID 权限,需要在原先的 755 前面加上 4,也就是 4755:

$ chmod 4755 filename

同样,可以用 2 和 1 来设置 SGID 和 SBIT 权限。设置完成后分别会用 s, s, t 代替文件权限中的 x。

其实,还可能出现 S 和 T 的情况。S 和 t 是替代 x 这个权限的,但是,如果它本身没有 x 这个权限,添加 SUID、SGID、SBIT 权限后就会显示为大写 S 或大写 T。比如我们为一个权限为 666 的文件添加 SUID、SGID、SBIT 权限:

执行 chmod 7666 nickfile,因为 666 表示 "-rw-rw-rw",均没有 x 权限,所以最后变成了 "-rwSrwSrwT"。

通过符号类型改变权限

除了使用数字来修改权限,还可以使用符号:

$ chmod u+s testfile # 为 testfile 文件加上 SUID 权限。
$ chmod g+s testdir # 为 testdir 目录加上 SGID 权限。
$ chmod o+t testdir # 为 testdir 目录加上 SBIT 权限。

References

鸟哥的 Linux- 特殊权限 SUID,SGID,SBIT Linux 特殊权限 SUID,SGID,SBIT